from django.shortcuts import render
from django.views import View
from django.conf import settings
from django.http import JsonResponse

import os

from alipay import AliPay

from orders.models import OrderInfo
from .models import Payment
# Create your views here.


# 支付接口1：获取支付页面url
class PaymentView(View):

    # GET + /payment/<order_id>/
    def get(self, request, order_id):
        # TODO: 获取扫码支付页面的url
        # (1)、构建Alipay支付对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None, # 支付成功之后支付宝主动请求回美多，要求美多服务器是线上服务器
            app_private_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'
            ),
            alipay_public_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payment/keys/alipay_public_key.pem'
            ),
            sign_type="RSA2", # 默认就是RSA2加密算法
            debug=settings.ALIPAY_DEBUG # debug模式设置为True有错误提示
        )

        # (2)、找对象里面的方法，来生成支付链接
        order = OrderInfo.objects.get(pk=order_id)
        # alipay.api_alipay_trade_app_pay() # 移动端支付url的查询字符串参数
        # 网页端支付url的查询字符串参数
        query_params = alipay.api_alipay_trade_page_pay(
            subject="美多商城订单%s支付"%order_id,
            out_trade_no=order_id, # 把美多商城订单号传递给支付宝
            total_amount=float(order.total_amount), # 支付宝要求传递float类型
            return_url=settings.ALIPAY_RETURN_URL, # 用户支付成功之后请求回美多的地址
        )
        # 拼接完整的请求url：前缀(协议、域名、端口和路径) + 查询字符串参数
        alipay_url = settings.ALIPAY_URL + '?' + query_params

        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'alipay_url': alipay_url
        })


# 支付接口2：校验支付参数，保存支付信息
class PaymentStatusView(View):

    # PUT + /payment/status/
    def put(self, request):
        # request.GET --> 是一个QueryDict类型。
        data = request.GET.dict() # QueryDict对象中的dict()函数作用是把它转换为python普通字典
        # 注意：我们需要把sign从字典中pop出来，后续支付宝接口校验的数据是除了sign意外的
        sign = data.pop('sign') # 提取用户校验支付数据真伪sign(签名)

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 支付成功之后支付宝主动请求回美多，要求美多服务器是线上服务器
            app_private_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'
            ),
            alipay_public_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payment/keys/alipay_public_key.pem'
            ),
            sign_type="RSA2",  # 默认就是RSA2加密算法
            debug=settings.ALIPAY_DEBUG  # debug模式设置为True有错误提示
        )
        # ======校验支付参数(支付宝查询字符串参数)=======
        result = alipay.verify(data, sign) # data是剔除sign以外的字典数据
        if not result:
            # 数据验证失败
            return JsonResponse({'code': 400, 'errmsg': '支付有误'})


        # ======保存支付信息=======
        order_id = data.get('out_trade_no')
        trade_id = data.get('trade_no')
        Payment.objects.create(
            order_id = order_id,# 美多商城订单id,
            trade_id = trade_id # 支付宝流水号
        )
        order = OrderInfo.objects.get(pk=order_id)
        order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
        order.save()

        return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_id})













